﻿// std_bind.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
//
//#include <iostream>
//#include <functional>
//#include <algorithm>
//#include <vector>
//using namespace std;
//
//int main()
//{
//    vector<int> coll;
//    for (int i = 1; i <= 10; ++i)
//    {
//        coll.push_back(i);
//    }
//
//    // 查找元素值大于10的元素的个数
//    // 也就是使得10 < elem成立的元素个数 
//    int res = count_if(coll.begin(), coll.end(), bind1st(less<int>(), 10));
//    cout << res << endl;
//
//    // 查找元素值小于10的元素的个数
//    // 也就是使得elem < 10成立的元素个数 
//    res = count_if(coll.begin(), coll.end(), bind2nd(less<int>(), 10));
//    cout << res << endl;
//
//    return 0;
//}

/*

#include <iostream>
#include <functional>
using namespace std;

class View
{
public:
    void onClick(int x, int y)
    {
        cout << "X : " << x << ", Y : " << y << endl;
    }
};

// 定义function类型, 三个参数
std::function<void(View, int, int)> clickCallback;

int main(int argc, const char* argv[])
{
    View button;

    // 指向成员函数
    clickCallback = &View::onClick;

    // 进行调用
    clickCallback(button, 10, 123);
    return 0;
}
*/
#include <iostream>
#include <functional>
using namespace std;

int TestFunc(int a, char c, float f)
{
    cout << a << "\t" << c << "\t" << f << endl;

    return a;
}

int main()
{
    auto bindFunc1 = std::bind(TestFunc, std::placeholders::_1, 'A', 100.1);
    bindFunc1(10);

    cout << "=================================\n";

    auto bindFunc2 = std::bind(TestFunc, std::placeholders::_2, std::placeholders::_1, 100.1);
    bindFunc2('B', 10);

    cout << "=================================\n";

    auto bindFunc3 = std::bind(TestFunc, std::placeholders::_2, std::placeholders::_3, std::placeholders::_1);
    bindFunc3(100.1, 30, 'C');
    // 即调用 TestFunc(30, 'C', 100.1)
    // std::placeholders::_2   : 30
    // std::placeholders::_3   : 'C'
    // std::placeholders::_1   : 100.1

    return 0;
}